/**
 * Author: YuBing 羽冰
 *  time : 2021/5/24
 * description: token生成器
 * dependency module: jsonwebtoken、crypto
 */

var jwt = require("jsonwebtoken");
var crypto = require("crypto");

// 构造函数
// 初始化混淆字符串
// 初始化基本不变的option,如iss,sub,aud及过期时间(单位 小时/h)
function JWTGenerator(_validtime, _mixin, _option) {
    this.mixin = _mixin || crypto.randomBytes(16).toString("hex"); // random string
    if (_validtime && !_option && _validtime.constructor === Object) {
        this.option = _validtime;
        return;
    }
    if (_validtime && _validtime.constructor === Number) this.validtime = _validtime
    if (_option && _option.constructor === Object) this.option = option;
}

// 不对外使用
JWTGenerator.prototype.assignOption = function (data, jti) {
    return Object.assign(
        {},
        this.option,
        {
            data,
            jti: jti || crypto.randomBytes(16).toString("hex"),
            // expire time default 2 hours
            exp: Math.floor(Date.now() / 1000) + 60 * 60 * (this.validtime || 2)
        }
    )
}

// 获取token令牌
// 参数1:token携带信息(必选)
// 参数2:token的唯一标识
JWTGenerator.prototype.sign = function (data, jti) {
    return jwt.sign(this.assignOption(data, jti), this.mixin);
}

// 验证token令牌
JWTGenerator.prototype.verify = function (token) {
    try {
        return jwt.verify(token, this.mixin);
    } catch (err) {
        // 无效的token
        return false;
    }
}

// 刷新token令牌
JWTGenerator.prototype.refresh = function (token, jti) {
    var tokenMsg = this.verify(token);
    if (!tokenMsg) return false;
    return this.sign(tokenMsg.data, jti);
}

module.exports = JWTGenerator;